package persistencia.carreras.ensambladores.general;

import modelo.geometria.Circunferencia;
import modelo.seniales.carteles.LimiteVelocidad;
import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.carreras.ensambladores.Campos;
import persistencia.carreras.ensambladores.Dummies;
import persistencia.carreras.ensambladores.EnsambladorComun;
import persistencia.compartido.ProductoSinValores;
import persistencia.compartido.Tipo;
import persistencia.excepciones.EscritorIncompatible;
import persistencia.excepciones.LectorIncompatible;

import compartido.IEntidad;

public class EnsambladorLimiteVelocidad implements IEnsamblador {

	@Override
	public boolean esComptabile(IProducto p) {
		return true;
	}

	@Override
	public IEntidad leer(IProducto p, IAlmacen almacen) throws LectorIncompatible {
		String id = p.getNombre();
		Circunferencia vision = Campos.leerVision(p, "");
		double velocidad = Campos.leerDouble(p, Campos.velocidad);
		boolean deMaxima = Campos.leerBoolean(p, Campos.deMaxima);
		
		LimiteVelocidad cartel = new LimiteVelocidad(Long.valueOf(id),vision.getCentro(),velocidad,deMaxima);
		return cartel;
	}

	@Override
	public boolean esCompatible(IEntidad e) {
		return (e instanceof LimiteVelocidad);
	}
	
	@Override
	public IProducto escribir(IEntidad e, IAlmacen fabrica) throws EscritorIncompatible {
		if (!esCompatible(e))
			throw new EscritorIncompatible();
		
		LimiteVelocidad cartel = (LimiteVelocidad)e;

		Tipo<IEntidad> tipo = new Tipo<IEntidad>(e.getClass());
		
		EnsambladorComun comun = new EnsambladorComun(fabrica);
		
		IProducto p = fabrica.crearProducto(Campos.identificador,cartel.getIdentificador(), tipo);
		comun.armarObstaculo(p, cartel);
		IIngrediente velocidad = fabrica.crearIngrediente(Campos.velocidad,String.valueOf(cartel.getVelocidad()));
		p.modificar(velocidad);
		IIngrediente deMaxima = fabrica.crearIngrediente(Campos.deMaxima,String.valueOf(cartel.esLimiteDeVelocidadMaxima()));
		p.modificar(deMaxima);
		
		return p;
	}

	@Override
	public IProducto getDummy(Tipo<IEntidad> tipo) throws EscritorIncompatible {
		Tipo<IEntidad> acepta = new Tipo<IEntidad>(LimiteVelocidad.class);
		if (!acepta.esSuperTipoDe(tipo))
			throw new EscritorIncompatible();
		
		ProductoSinValores p = new ProductoSinValores();
		p.agregarCampo(Campos.identificador);
		Dummies.esObstaculo(p, "");
		p.agregarCampo(Campos.velocidad);
		p.agregarCampo(Campos.deMaxima);
		
		return p;
	}

}
